<?php
/*
 * 这里是进制转换方法，只针对于正整数，能力有限，小数负数不会，还请见谅
 * 关于多进制的计算，其实完全可以先转换成 十进制数字，然后在进行计算
 * 关于小数的计算，则也可以先转换成整数再计算
 * 关于负数的计算，则也可以先转换成正数再计算
 * 数字是基础，符号是附加
 * 之所以使用十进制进行计算，是因为日常习惯，
 *
 *
 * decbin()：十进制转二进制函数
 * dechex()：十进制转八进制
 * decoct()：十进制转十六进制
 * bin2hex()：二进制转十六进制
 * bindec()：二进制转十进制
 * octdec()：八进制转十六进制
 * hexdec()：十六进制转十进制
 * base_convert ( string number, int frombase, int tobase ) 任意进制的换算
 * 写完之后才发现还有这些函数，傻逼了
 *
 * 如果使用过程中发现出错了，麻烦自己删掉，抱歉了
 */

/**
 * 十进制 与 N进制 对照表 ，可以自己随意扩展
 * @param $num 十进制数字
 * @return mixed|string
 */
function decimalToNSystemComparisonTable($num){
    $ch=array(
        '0'=>'0',
        '1'=>'1',
        '2'=>'2',
        '3'=>'3',
        '4'=>'4',
        '5'=>'5',
        '6'=>'6',
        '7'=>'7',
        '8'=>'8',
        '9'=>'9',
        '10'=>'A',
        '11'=>'B',
        '12'=>'C',
        '13'=>'D',
        '14'=>'E',
        '15'=>'F'
    );

    if(isset($ch[$num])){
        return $ch[$num];
    }
    return '';
}

/**
 *  N进制 与 十进制 对照表 ，可以自己随意扩展
 * @param $num N 进制数字
 * @return mixed|string
 */
function NSystemToDecimalComparisonTable($num){
    $ch=array(
        '0'=>'0',
        '1'=>'1',
        '2'=>'2',
        '3'=>'3',
        '4'=>'4',
        '5'=>'5',
        '6'=>'6',
        '7'=>'7',
        '8'=>'8',
        '9'=>'9',
        'A'=>'10',
        'B'=>'11',
        'C'=>'12',
        'D'=>'13',
        'E'=>'14',
        'F'=>'15'
    );

    if(isset($ch[$num])){
        return $ch[$num];
    }
    return '';
}

/**
 * 十进制数字 转为 N 进制的数字
 * @param $decimal_num 十进制数字 正整数
 * @param $system 进制等级 2,8,10,16
 * @param $decimal__to_n_system_comparison_table  十进制的相对于 N进制数字的转换
 * @return string
 */
function decimalToNSystem($decimal_num,$system, $decimal__to_n_system_comparison_table='decimalToNSystemComparisonTable'){
    $shang=(int) abs($decimal_num);
    $re_num='';
    for (;;){
        $yu=$shang%$system;
        $shang=intval($shang/$system);
        $re_num.=$decimal__to_n_system_comparison_table($yu);
        if(!$shang){
            break;
        }
    }
    return strrev($re_num);
}

/**
 * N进制数字 转为 十进制的数字
 * @param $decimal_num N进制写法
 * @param $system 进制等级 2,8,10,16
 * @param $n_system_to_decimal_comparison_table N 进制的相对于 十进制数字的转换
 * @return string
 */
function  NSystemToDecimal($other,$system,$n_system_to_decimal_comparison_table='NSystemToDecimalComparisonTable'){
    $num=strrev($other);
    $re_num=0;
    for ($i=0;;$i++){
        if(isset($num[$i])){
            $re_num+= pow($system,$i) * (int)$n_system_to_decimal_comparison_table($num[$i]);
        }else{
            break;
        }
    }
    return $re_num;
}



